<?php

require_once(BaseConfig::LoadClass('estadisticas.class.php'  ));
require_once(BaseConfig::LoadClass('tablas_llenado.class.php'));

class PAIDEA_Eje2_IndiceAprobacion extends Estadisticas {
  var $strNombreBase;
  
  function PAIDEA_Eje2_IndiceAprobacion($strNombreBase) {
    $this->strNombreBase = $strNombreBase;
  }
  
  function __GetConectaObject() {
    $oConecta = new ConectaP("", $this->strNombreBase);
    return $oConecta;
  }
  
  /**
   * Crea una liga para poder mostrar un reporte extra de los alumnos de cierto
   * tipo
   * 
   * @param string $strTipo    Tipo que se mostrara (apro, repro, tot)
   * @param string $strMateria Clave de la materia a mostrar
   * @param string $strPeriodo Periodo a mostrar
   * 
   * @return string La liga a mostrar
   */
  function CrearLigaGrupo($strTipo, $strMateria, $strPeriodo) {
    $strRes  = "";
    
    $strRes .= "index.php";
    $strRes .= "?option=" . Variables::GetPageOption();
    $strRes .= "&__OGTipoRep=sub1";
    $strRes .= "&tipo=$strTipo";
    $strRes .= "&materia=$strMateria";
    $strRes .= "&periodo=$strPeriodo";
    $strRes .= "&carrera=" . $this->strNombreBase;
    
    return $strRes;
  }
  
  function CrearLigaKardex($strNumCta) {
    $strRes  = "";
    
    $strRes .= "index.php";
    $strRes .= "?option=kardex_alumno";
    $strRes .= "&no_cta=$strNumCta";
    $strRes .= "&carrera=" . $this->strNombreBase;
    
    return $strRes;
  }
  
  function ListadoSub1($strTipo, $strMateria, $strPeriodo) {
    $arrIndiceTipos = array();
    $arrIndiceTipos["apro" ] = "Aprobados";
    $arrIndiceTipos["repro"] = "Reprobados";
    $arrIndiceTipos["tot"  ] = "Total";
    
    $oConecta = $this->__GetConectaObject();
    
    $strPeriodoNormalizado = substr($strPeriodo, 0, 4) . substr($strPeriodo, -1, 1);
    $strConsulta  = "";
    $strConsulta .= "SELECT ";
    $strConsulta .= "  asg.asg_clave      , ";
    $strConsulta .= "  asg.asg_nombre     , ";
    $strConsulta .= "  t.hst_calificacion , ";
    $strConsulta .= "  t.alm_numero_cuenta, ";
    $strConsulta .= "  alm.alm_ap_pat     , ";
    $strConsulta .= "  alm.alm_ap_mat     , ";
    $strConsulta .= "  alm.alm_nombre     , ";
    $strConsulta .= "  g.grp_clave        , ";
    $strConsulta .= "  CASE t.hst_calificacion ";
    $strConsulta .= "    WHEN 'NP' THEN 0 ";
    $strConsulta .= "    ELSE 1 END ";
    $strConsulta .= "  AS orden_ext ";
    $strConsulta .= "FROM (SELECT * FROM historial UNION SELECT * FROM acta_alumno) AS t ";
    $strConsulta .= "JOIN asignatura AS asg USING (asg_id) ";
    $strConsulta .= "JOIN acta       AS a   USING (act_folio, pest_clave,asg_id) ";
    $strConsulta .= "JOIN grupo      AS g   USING (grp_id) ";
    $strConsulta .= "JOIN alumno     AS alm USING (alm_numero_cuenta) ";
    $strConsulta .= "WHERE a.prd_id LIKE '$strPeriodoNormalizado%1' ";
    $strConsulta .= "AND asg.asg_clave = '$strMateria' ";
    $strConsulta .= "ORDER BY asg.asg_clave, asg.asg_nombre, g.grp_clave, orden_ext DESC, t.hst_calificacion DESC ";
//    $strConsulta .= "ORDER BY asg.asg_clave, asg.asg_nombre, g.grp_clave, alm.alm_ap_pat, alm.alm_ap_mat, alm.alm_nombre";
//    die($strConsulta);
    $oConecta->Consulta($strConsulta);
    if($oConecta->EOF) {
      return "<h1>No se encontraron datos [{$arrIndiceTipos[$strTipo]}] de la materia {$strMateria} en el periodo {$strPeriodo}</h1>";
    }
    
    $strRes  = "";
    $strRes .= "<table class='TablaReportes'>";
    $strRes .= "<tr><th colspan='6'>" . $oConecta->Field('asg_clave') . " - " . $oConecta->Field('asg_nombre') . "</th></tr>";
    $strRes .= "<tr><th colspan='6'>Periodo $strPeriodo [{$arrIndiceTipos[$strTipo]}]</th></tr>";
    $strRes .= "<tr><th>Grupo</th><th>No. Cta</th><th colspan='3'>Nombre</th><th>Calif.</th></tr>";
    
    $strUltimoGrupo = "";
    $intAprobados = $intReprobados = 0;
    
    $strSeriesRepro = "";
    $strSeriesApro  = "";
    $strSeriesTot   = "";
    $strCategorias  = "";
    
    $strCategorias .= "[";
    
    $strSeriesRepro = "{name: 'Reprobados', stack:1, color: '#990000', data: [";
    $strSeriesApro  = "{name: 'Aprobados' , stack:1, color: '#009900', data: [";
    $strSeriesTot   = "{name: 'Total'     , stack:1, color: '#000099', data: [";
    while(!$oConecta->EOF) {
      if(($oConecta->Field('hst_calificacion') - 0) >= 6) {
        $bolAprobado = true;
        $intAprobados++;
      } else {
        $bolAprobado = false;
        $intReprobados++;
      }
      
      if($strUltimoGrupo != $oConecta->Field('grp_clave')) {
        $intTotal = $intAprobados + $intReprobados;
        if($strUltimoGrupo != "") {
          if($intTotal) {
            $intPorc = intval(($intAprobados / $intTotal) * 100);
          } else {
            $intPorc = 0;
          }
          
          $strCategorias  .= "'$strUltimoGrupo', ";
          $strSeriesRepro .= "$intReprobados, "   ;
          $strSeriesApro  .= "$intAprobados, "    ;
          $strSeriesTot   .= "$intTotal, "        ;
          
          $strRes .= "<tr>";
          $strRes .= "<th colspan='2'>$intAprobados Aprobados ($intPorc %)</th>";
          $strRes .= "<th colspan='2'>$intReprobados Reprobados (" . (100 - $intPorc) . " %)</th>";
          $strRes .= "<th colspan='2'>$intTotal Total</th>";
          $strRes .= "</tr>";
          
          $intAprobados = $intReprobados = 0;
        }
        $strUltimoGrupo = $oConecta->Field('grp_clave');
        $strRes .= "<tr><td colspan='6'><hr /></td></tr>";
        $strRes .= "<tr><th colspan='6'>Grupo $strUltimoGrupo</th></tr>";
      }
      
      switch($strTipo) {
        case 'apro':
          $bolIncluir = $bolAprobado;
          break;
        
        case 'repro':
          $bolIncluir = !$bolAprobado;
          break;
        
        case 'tot':
          $bolIncluir = true;
      }
      
      if($bolIncluir) {
        if(($oConecta->Field('hst_calificacion') - 0) >= 8) {
          $strRes .= "<tr class='ColumnasApro2'>";
        } else if(($oConecta->Field('hst_calificacion') - 0) >= 6) {
          $strRes .= "<tr class='ColumnasApro1'>";
        } else if($oConecta->Field('hst_calificacion') == "NP") {
          $strRes .= "<tr class='ColumnasReproNP'>";
        } else {
          $strRes .= "<tr class='ColumnasRepro'>";
        }
        $strRes .= "<td>" . $oConecta->Field('grp_clave'        ) . "</td>";
        $strRes .= "<td><a href='" . $this->CrearLigaKardex($oConecta->Field('alm_numero_cuenta')) . "'>" . $oConecta->Field('alm_numero_cuenta') . "</a></td>";
        $strRes .= "<td>" . $oConecta->Field('alm_ap_pat'       ) . "</td>";
        $strRes .= "<td>" . $oConecta->Field('alm_ap_mat'       ) . "</td>";
        $strRes .= "<td>" . $oConecta->Field('alm_nombre'       ) . "</td>";
        $strRes .= "<td>" . $oConecta->Field('hst_calificacion' ) . "</td>";
        $strRes .= "</tr>";
      }
      
      $oConecta->MoveNext();
    }
    
    $intTotal = $intAprobados + $intReprobados;
    if($intTotal) {
      $intPorc = intval(($intAprobados / $intTotal) * 100);
    } else {
      $intPorc = 0;
    }

    $strCategorias  .= "'$strUltimoGrupo'] ";
    $strSeriesRepro .= "$intReprobados]} "  ;
    $strSeriesApro  .= "$intAprobados]} "   ;
    $strSeriesTot   .= "$intTotal]} "       ;
    
    $strSeries = "[$strSeriesApro, $strSeriesRepro]";
    $strSeries2 = "[$strSeriesTot, $strSeriesApro, $strSeriesRepro]";

    $strRes .= "<tr>";
    $strRes .= "<th colspan='2'>$intAprobados Aprobados ($intPorc %)</th>";
    $strRes .= "<th colspan='2'>$intReprobados Reprobados (" . (100 - $intPorc) . " %)</th>";
    $strRes .= "<th colspan='2'>$intTotal Total</th>";
    $strRes .= "</tr>";
    
    $strRes .= "</table>";
    
    $this->strAltoDiv  = "500";
    $this->strAnchoDiv = "100%";
    
    Template::AgregarArchivoExtra_S("highcharts/highcharts.js", "js");
    Template::AgregarArchivoExtra_S("codigo_graficas.js", "js");
    
    $strG1 = $this->__ObtenerLlamadaGraficacion('stacked_column', $strSeries , $strCategorias, $this->strNombreReporte . " -- Materia [{$strMateria}] - Periodo [{$strPeriodo}]", "normal");
    $strG2 = $this->__ObtenerLlamadaGraficacion('stacked_column', $strSeries2, $strCategorias, $this->strNombreReporte . " -- Materia [{$strMateria}] - Periodo [{$strPeriodo}]", "nostack");
    $strG3 = $this->__ObtenerLlamadaGraficacion('stacked_column', $strSeries , $strCategorias, $this->strNombreReporte . " -- Materia [{$strMateria}] - Periodo [{$strPeriodo}]", "percent");
    return $strG1 . $strG2 . $strG3 . $strRes;
//    return $this->__ObtenerLlamadaGraficacion('stacked_column', $strSeries, $strCategorias, $this->strNombreReporte) . $strRes;
  }
  
  function DoDefaultManager() {
    switch(Variables::GetOption('__OGTipoRep')) {
      case 'sub1':
        // Sub Reporte primero (Listado de alumnos que aprobaron, reprobaron o lista total
        return $this->ListadoSub1(Variables::GetOption('tipo'), Variables::GetOption('materia'), Variables::GetOption('periodo'));
        break;
      default:
        return parent::DoDefaultManager();
    }
  }
  
  function ObtenerGrafica($strTipoGrafica = "stacked_column") {
    $strPagina  = "";
    $strPagina .= parent::ObtenerGrafica($strTipoGrafica);
    $strPagina .= "<table class='TablaReportes' width='100%' border='1'>";
    $strPagina .= TablasLlenado::__TemplateSeleccionCarrera(
      $this->strNombreBase, 
      Variables::GetOption('generaciones'), 
      2, 1, 
      $this->__TemplateSeleccionMateria() . $this->__ObtenerFormaOpcionesGrafica()
    );
    $strPagina .= "</table>";
    
    return $strPagina;
  }
  
  function __ManejarDatosPreGrafica($arrDatos) {
    return $arrDatos;
//    prent_R($arrDatos);
  }
  
  function __TemplateSeleccionMateria() {
    $i = 0;
    $arrOpciones = array();
    foreach($this->arrReporte as $arrLineaRep) {
      $strLlave = "";
      foreach($this->arrInfoReporte as $strClave => $arrLineaInfoRep) {
        if(substr($arrLineaInfoRep["Tipo"], 0, 1) == "C") {
          $strLlave .= "{$arrLineaRep[$strClave]} ";
        }
      }
      
      $strLlave = trim($strLlave);
      $arrOpciones[$strLlave] = $strLlave;
    }
    
    $strRes  = "";
    $strRes .= "<hr />";
    $strRes .= "<input type='checkbox' id='id_chk_materias' onclick='SelectAllCheckboxesComun(\"#id_chk_materias\", \".cls_chk_materias\")'/> Seleccionar todas";
    $strRes .= Variables::GetCheckboxesByArray($arrOpciones, Variables::GetOption('materias'), "materias[]", 3, false, "width='100%'", "", 0, "class='cls_chk_materias'");
    
    return $strRes;
  }
  
  function IncluirHTMLDespues() {
    return TablasLlenado::__TemplateSeleccionCarrera($this->strNombreBase, Variables::GetOption('generaciones'), 2, count($this->arrInfoReporte), $this->__ObtenerFormaOpcionesGrafica(false, false, true));
  }
  
  function __DefaultConsultaIni() {
    $strConsulta  = "";
    $strConsulta .= "SELECT ";
    $strConsulta .= "  periodo   , ";
    $strConsulta .= "  asg_clave , ";
    $strConsulta .= "  asg_nombre, ";
    $strConsulta .= "  naporb    , ";
    $strConsulta .= "  ntotal      ";
    $strConsulta .= "FROM indices_aprob ";
    if(is_array(Variables::GetOption('generaciones'))) {
      $strConsulta .= "WHERE periodo IN ('" . join("', '", Variables::GetOption('generaciones')) . "') ";
    } else {
      $strConsulta .= "WHERE periodo = 'XXXX' ";
    }
    $strConsulta .= "ORDER BY periodo ASC, asg_clave ASC ";
    
    return $strConsulta;
  }
  
  function InitDefaults($strNombreReporte = "", $strOpAgrupar = "") {
    if(!$strNombreReporte) {
      $arrCarreras = TablasLlenado::GetArrayNombresCarreras();
      if($this->strNombreBase) {
        $strNombreReporte = "Indice de aprobacion para " . $arrCarreras[$this->strNombreBase];
      } else {
        $strNombreReporte = "Indice de aprobacion";
      }
    }
    parent::InitDefaults($strNombreReporte, $strOpAgrupar);
  }
  
  function __ArreglarDatosPrevioGrafica() {
    $arrReporte = $this->__ArreglarDatosPrevioMuestreo(true, false, "", false);
    
    $arrMaterias = Variables::GetOption('materias');
    if((is_array($arrMaterias)) && (count($arrMaterias) > 0)) {
      $arrRep2 = array();
      foreach($arrReporte as $arrLineaRep) {
        $strLlave = "";
        foreach($this->arrInfoReporte as $strClave => $arrLineaInfoRep) {
          if(substr($arrLineaInfoRep["Tipo"], 0, 1) == "C") {
            $strLlave .= "{$arrLineaRep[$strClave]} ";
          }
        }

        $strLlave = trim($strLlave);
        if(in_array($strLlave, $arrMaterias)) {
          $arrRep2[] = $arrLineaRep;
        }
      }
      unset($arrReporte);
      $arrReporte = $arrRep2;
      unset($arrRep2);
    }
    
    $this->arrInfoGrafica["asg_clave" ]["Nombre"] = "Clave";
    $this->arrInfoGrafica["asg_clave" ]["Tipo"  ] = "C";
    $this->arrInfoGrafica["asg_nombre"]["Nombre"] = "Nombre";
    $this->arrInfoGrafica["asg_nombre"]["Tipo"  ] = "C";
    
    $this->arrDifHeaderGrafica[] = array("Asignatura", "asg_clave", "asg_nombre");
    
    foreach($this->arrPeriodos as $strPeriodo) {
      foreach($arrReporte as $intNumLin => $arrInfoLinea) {
        $arrReporte[$intNumLin]["{$strPeriodo}_repro"] = $arrInfoLinea["{$strPeriodo}_tot"] - $arrInfoLinea["{$strPeriodo}_apro"];
        
        $arrReporte[$intNumLin]["xURL_{$strPeriodo}_repro"] = $this->CrearLigaGrupo("repro", $arrInfoLinea["asg_clave"], $strPeriodo);
        $arrReporte[$intNumLin]["xURL_{$strPeriodo}_apro" ] = $this->CrearLigaGrupo("apro" , $arrInfoLinea["asg_clave"], $strPeriodo);
        $arrReporte[$intNumLin]["xURL_{$strPeriodo}_tot"  ] = $this->CrearLigaGrupo("tot"  , $arrInfoLinea["asg_clave"], $strPeriodo);
      }
      if(Variables::GetOption('__OGStacking') == "nostack") {
        $this->arrInfoGrafica["{$strPeriodo}_tot"]["Nombre"] = "Total";
        $this->arrInfoGrafica["{$strPeriodo}_tot"]["Tipo"  ] = "I";
        $this->arrInfoGrafica["{$strPeriodo}_tot"]["Color" ] = "#000099";
      }
      $this->arrInfoGrafica["{$strPeriodo}_apro" ]["Nombre"] = "Apro";
      $this->arrInfoGrafica["{$strPeriodo}_apro" ]["Tipo"  ] = "I";
      $this->arrInfoGrafica["{$strPeriodo}_apro" ]["Color" ] = "#009900";
      $this->arrInfoGrafica["{$strPeriodo}_repro"]["Nombre"] = "Rep";
      $this->arrInfoGrafica["{$strPeriodo}_repro"]["Tipo"  ] = "I";
      $this->arrInfoGrafica["{$strPeriodo}_repro"]["Color" ] = "#990000";
      
      $this->arrDifHeaderGrafica[] = array($strPeriodo, "{$strPeriodo}_tot", "{$strPeriodo}_apro", "{$strPeriodo}_repro");
      
    }
    $arrReporte = $this->__ArrangeArray($arrReporte);
    
    return $arrReporte;
  }
  
  function ManejarReporte($arrReporte) {
    $arrReporteRet = array();
    $arrTmpPer     = array();
    
    $this->arrInfoReporte["asg_clave" ]["Nombre"] = "Clave";
    $this->arrInfoReporte["asg_clave" ]["Tipo"  ] = "C";
    $this->arrInfoReporte["asg_nombre"]["Nombre"] = "Nombre";
    $this->arrInfoReporte["asg_nombre"]["Tipo"  ] = "C";
    
    foreach($arrReporte as $arrInfoLinea) {
      $arrReporteRet[$arrInfoLinea["asg_clave"]]["asg_clave"                       ] = $arrInfoLinea["asg_clave" ];
      $arrReporteRet[$arrInfoLinea["asg_clave"]]["asg_nombre"                      ] = $arrInfoLinea["asg_nombre"];
      $arrReporteRet[$arrInfoLinea["asg_clave"]][$arrInfoLinea["periodo"] . "_tot" ] = $arrInfoLinea["ntotal"    ];
      $arrReporteRet[$arrInfoLinea["asg_clave"]][$arrInfoLinea["periodo"] . "_apro"] = $arrInfoLinea["naporb"    ];
      
      $this->arrInfoReporte[$arrInfoLinea["periodo"] . "_tot" ]["Nombre"] = "Insc";
      $this->arrInfoReporte[$arrInfoLinea["periodo"] . "_tot" ]["Tipo"  ] = "I";
      $this->arrInfoReporte[$arrInfoLinea["periodo"] . "_apro"]["Nombre"] = "Apro";
      $this->arrInfoReporte[$arrInfoLinea["periodo"] . "_apro"]["Tipo"  ] = "I";
      
      $arrTmpPer[$arrInfoLinea["periodo"]] = $arrInfoLinea["periodo"];
    }
    
    $this->arrDifHeader[] = array("Asignatura", "asg_clave", "asg_nombre");
    
    foreach($arrTmpPer as $strNomPer) {
      $this->arrDifHeader[] = array($strNomPer, "{$strNomPer}_tot", "{$strNomPer}_apro");
    }
    
    // Guardamos el arreglo de periodos para ser usado cuando se muestren las graficas
    $this->arrPeriodos = $arrTmpPer;
    
    $this->arrReporte = $arrReporteRet;
    
    return $arrReporteRet;
  }
}

?>